package cn.hongwei.eduservice.listener;

import cn.hongwei.eduservice.entity.Subject;
import cn.hongwei.eduservice.entity.excel.SubjectExcelData;
import cn.hongwei.eduservice.mapper.SubjectMapper;
import com.alibaba.excel.context.AnalysisContext;
import com.alibaba.excel.event.AnalysisEventListener;

import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import lombok.extern.slf4j.Slf4j;
@Slf4j
public class SubjectDataListener extends AnalysisEventListener<SubjectExcelData> {
    // 获取mapper的方式1：  当前类通过组件注解标注 可以使用自动装配
   // @Autowired // 自动装配只能在 组件类中使用，它是从容器中获取对象

    // 获取mapper的方式2：  自己初始化 , 构造器中传参，接受传入的mapper对象，当前类的实例以后谁谁用谁负责传入mapper对象
    SubjectMapper subjectMapper;

    public SubjectDataListener( SubjectMapper subjectMapper){
        this.subjectMapper = subjectMapper;
    }

    @Override
    public void invoke(SubjectExcelData subjectExcelData, AnalysisContext analysisContext) {
    //将subjectExcelData的数据解析  手动 转为 Subject类型的对象存到数据库
        String levelOneTitle = subjectExcelData.getLevelOneTitle();
        String levelTwoTitle = subjectExcelData.getLevelTwoTitle();
        //每一行数据对应两个课程分类， 课程分类有可能有重复的
        //1、将一级标题 转为一级课程分类对象存到数据
        // 先判断数据库中是否存在该一级分类，如果不存在才存,如果存在查询一级分类
        LambdaQueryWrapper<Subject> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.eq(Subject::getTitle,levelOneTitle);
        queryWrapper.eq(Subject::getParentId,0);

        Subject levelOneSubject = subjectMapper.selectOne(queryWrapper);
        if(levelOneSubject == null){
            //保存到数据库中
            levelOneSubject = new Subject();
            levelOneSubject.setParentId("0");
            levelOneSubject.setTitle(levelOneTitle);
            levelOneSubject.setSort(0);
            subjectMapper.insert(levelOneSubject);
        }


        //2、将二级标题转为二级分类存到数据库
        //先判断二级标题是否存在，如果不存在   还需要将二级分类绑定上面的一级分类作为自己的父分类 再存到数据库
        queryWrapper.clear();//清空之前的条件
        queryWrapper.eq(Subject::getTitle,levelTwoTitle);
        queryWrapper.eq(Subject::getParentId , levelOneSubject.getId());
        Integer count = subjectMapper.selectCount(queryWrapper);// select count(*) from asd
        if(count==0){
            Subject subject = new Subject();
            subject.setSort(0);
            subject.setTitle(levelTwoTitle);
            subject.setParentId(levelOneSubject.getId());
            subjectMapper.insert(subject);
        }


    }

    @Override
    public void doAfterAllAnalysed(AnalysisContext analysisContext) {
        log.info("subject数据解析完毕");
    }
}
